package com.jutixueyuan.service.impl;

import com.jutixueyuan.pojo.LivegoodsResult;
import com.jutixueyuan.pojo.LoginLog;
import com.jutixueyuan.pojo.ValidateCode;
import com.jutixueyuan.service.PassportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.util.Date;
import java.util.UUID;

@Service
public class PassportServiceImpl implements PassportService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 发送验证码思路
     *
     * 1，接受手机号
     *   把手机号做key，生成随机4位数字存入到redis中，时长是2分钟
     * 2，如果2分钟以内，相同手机再次发送，返回提示信息，验证码2分钟有效，请不要频繁发送验证码
     * 3，如果超过2分钟，相同手机再次发送，重新生成信息的随机码
     *
     */
    @Override
    public LivegoodsResult sendVerifyCode(String phone) {

        //从Redis获取对应手机的key
        ValidateCode verifyCode = (ValidateCode) redisTemplate.opsForValue().get(phone);
        if(verifyCode!=null){
            return LivegoodsResult.error("验证码2分钟有效，请不要频繁发送验证码");
        }

        //生成随机4位数数组
        String verifCode = UUID.randomUUID().toString().substring(0, 4);

        //创建验证码对象
        ValidateCode validateCode = new ValidateCode();
        validateCode.setCode(verifCode);
        validateCode.setPhone(phone);

        redisTemplate.opsForValue().set(phone,validateCode, Duration.ofMinutes(2));
        //TODO 调用阿里云或者腾讯云的发送短信API 将随机发发送给用户手机

        return LivegoodsResult.ok();
    }

    /**
     * 将当前用户的登录行为作为一条日志数据存储到登录日志表中
     *
     */
    @Override
    public LivegoodsResult login(String username, String password) {

        try{
            //创建登录日志对象
            LoginLog loginLog = new LoginLog();
            loginLog.setUsername(username);
            loginLog.setPassword(password);
            loginLog.setTime(new Date());
            loginLog.setType(1);

            //从Redis中获取验证码和password（短信登录的验证码）进行比对
            ValidateCode validateCode = (ValidateCode) redisTemplate.opsForValue().get(username);
            //如果对象不存在，说明验证码过期
            if(validateCode == null){
                loginLog.setResult(500);
                loginLog.setMsg("短信验证码过期");
                //将登陆日志信息存储到数据库MongoDB
                mongoTemplate.insert(loginLog);
                return LivegoodsResult.error("短信验证码过期，请重新发送验证码");
            }else{
                //验证码没有过期
                //比对用户输入的验证码和Redis中的随机码
                if(!validateCode.getCode().equals(password)){
                    loginLog.setResult(500);
                    loginLog.setMsg("验证码不正确");
                    //将登陆日志信息存储到数据库MongoDB
                    mongoTemplate.insert(loginLog);
                    return LivegoodsResult.error("验证码错误，请输入正确验证码");
                }else{
                    loginLog.setResult(200);
                    //将登陆日志信息存储到数据库MongoDB
                    mongoTemplate.insert(loginLog);
                    //登陆成功，删除redis中的验证码
                    redisTemplate.delete(username);
                    return LivegoodsResult.ok();
                }
            }

        }catch (Exception e){
            e.printStackTrace();
            return LivegoodsResult.error("请求失败！");

        }
    }
}
